#include <stdio.h>
#include <malloc.h>

//变量与指针
int main() {

    int a = 15;
    int b = 255;
    int c = 315;
    printf("a:%x    b:%x     c:%x\n", &a, &b, &c);


    //为了让我们进行间接对于值进行操作，能够让我们操作地址，所以他给了一个运算符出来，取址运算符  &

    //指针变量的类型，他是用来决定计算时的操作单位
    //大小是固定的
    //变量类型的作用是在计算上面！4  char 1  long 8
    int* p = &b;//int char等类型决定指针移动位置

    //char挪动一个地址 61fe13
    //int 一次性动4个地址！
//    p = p - 1;


    //核心,指针变量只接受+ - 的运算

//    *取值

//    *++p;//上移一位指针，先移动，在取值 *(p++);
//    *--p;//下移一位指针，先移动，在取值
    //他就是JAVA  的system,out.print(++i i++)
//    printf("p-value:%d",*p++);
//    *p++;//上移一位指针，先取值，在移动
//    *p--;//下移一位指针，先取值，在移动
//    ++*p;//指针不进行移动，直接取地址值后进行运算
//    --*p;//指针不进行移动，直接取地址值后进行运算
//    *(p++); //等价于*++p,但是衍生出多位移动 *(p+=2);
//    *(p--); //等价于*--p,但是衍生出多位移动 *(p-=2);

//    p = p - 2;//不要*的时候，独立对于指针变量的操作统一视为地址操作

    //C语言，设计角度提出的就是给了两套方案
    //1.不用你来操作地址  直接操作数据
    //2.直接给地址给你操作 间接操作数据
    //某些场景   复制运算  1K---》 1帧 ----->60  30帧

    //两个指针变量进行加减
    //只会去计算他们的地址差额的个数
    int* p1 = &a;
    int* p2 = &c;

    int p3 = p2 - p1;
    printf("p3 value:%d\n", p3);

//    int **ps = &a;

    //*取值运算符
    printf("p value:%d\n", *p);

//    printf("ps value:%d\n", *ps);

//    //数据类型转换本质就是去规定数据提取的个数
//    char* p2 = &c;
//    int result = (char*)p-p2;//类型转换的本质就是提取数据的位数不匹配导致，默认转小
//    printf("result value:%d\n", result);




    // NULL = 地址0
    char* p4 = malloc(32);

    int* p5 = NULL;
    printf("p5 value : %d",p5);
//    if(p4 != NULL){
//
//    }


    return 0;
}
